﻿using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using System.Windows.Forms;
using VirtualInput;

namespace test001
{
    public partial class Form1 : Form
    {
        private Point lockP;
        private bool locked;

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            IntPtr g = User32.FindWindow("D3D Window",
                "GrandChase Eternal v1.05.62 (20090120)");
            Collection<IntPtr> cIntPtrs = new Collection<IntPtr>();


            var temp = User32.FindWindowEx(g, IntPtr.Zero, "Edit", string.Empty);
            while (temp != IntPtr.Zero)
            {
                cIntPtrs.Add(temp);
                temp = User32.FindWindowEx(g, temp, "Edit", string.Empty);
            }

            User32.PostMessage(g, WMsg.WM_ACTIVATEAPP, (IntPtr)1, (IntPtr)1748);
            //NativeMethods.SendMessage(hWndButton, WMsg.WM_SETTEXT, 0, "lol");
            int i = 0;
            foreach (var intPtr in cIntPtrs)
            {
                NativeMethods.SendMessage(intPtr, WMsg.WM_SETTEXT, 0, i.ToString());

                i++;
            }
            this.button1.Text = i.ToString();
            //NativeMethods.SendMessage(g, WMsg.WM_SETTEXT, 0, "lol");

            // System.Threading.Thread.Sleep(500);
        }

        private static ProcessMemory Mem;


        private void Form1_Load(object sender, EventArgs e)
        {
            Mem = new ProcessMemory("LegBoneMS");
            if (!Mem.CheckProcess())
            {
                //       MessageBox.Show("Make sure your application is running or try running this as Admin");
            }
            else
            {
                Mem.StartProcess();
            }
        }
        [DllImport("user32.dll")]
        static extern IntPtr DefWindowProc(IntPtr hWnd, IntPtr uMsg, IntPtr wParam, IntPtr lParam);
        private void button2_Click(object sender, EventArgs e)
        {
            IntPtr g = User32.FindWindow("D3D Window",
    "GrandChase Darkness");
            for (; ; )
            {
                //User32.PostMessage(g, WMsg.WM_MOUSEMOVE, IntPtr.Zero, CreateLParam(300, 300));
                //User32.PostMessage(g, WMsg.WM_MOUSEMOVE, IntPtr.Zero, IntPtr.Zero);
                //User32.DefWindowProc((IntPtr)0x000f0562, WMsg.WM_ACTIVATE, (IntPtr)1, (IntPtr)1700);
                //User32.PostMessage(g, WMsg.WM_ACTIVATEAPP, (IntPtr)1, (IntPtr)1748);
                //User32.PostMessage(g, WMsg.WM_SETCURSOR, IntPtr.Zero, IntPtr.Zero);
                User32.PostMessageA(g, (uint)WMsg.WM_SETFOCUS, (int)VirtualKeys.Return, makeLp(VirtualKeys.Return, WMsg.WM_KEYDOWN));
                System.Threading.Thread.Sleep(33);
                User32.PostMessageA(g, (uint)WMsg.WM_KEYDOWN, (int)VirtualKeys.Return, makeLp(VirtualKeys.Return, WMsg.WM_KEYDOWN));

                User32.PostMessageA(g, (uint)WMsg.WM_KEYUP, (int)VirtualKeys.Return, makeLp(VirtualKeys.Return, WMsg.WM_KEYUP));


                System.Threading.Thread.Sleep(1);
            }


        }
        private static IntPtr CreateLParam(int LoWord, int HiWord)
        {
            return (IntPtr)((HiWord << 16) | (LoWord & 0xffff));
        }

        private Thread b3t = null;
        bool bb3t = false;
        private void button3_Click(object sender, EventArgs e)
        {
            if (null == b3t)
            {

                b3t = new Thread(new ThreadStart(Service));
                b3t.IsBackground = true;
                b3t.Start();
            }
            else
            {
                bb3t = !bb3t;
            }
        }
        private void Service3()
        {
            IntPtr g = User32.FindWindow("MapleStoryClass",
                                        null);
            int checkPeriod = (int)(0.033 * 1000);

            for (; ; )
            {
                if (false == bb5t)
                {
                    RingPst(g, VirtualKeys.G, RingPstType.down);
                }
                System.Threading.Thread.Sleep(checkPeriod);

            }
        }

        private void Service2()
        {
            IntPtr g = User32.FindWindow("MapleStoryClass",
                                        null);
            int checkPeriod = (int)(0.033 * 1000);

            for (; ; )
            {
                if (false == bb4t)
                {
                    RingPst(g, VirtualKeys.T, RingPstType.press);
                }
                System.Threading.Thread.Sleep(checkPeriod);

            }
        }
        private void Service()
        {
            IntPtr g = User32.FindWindow("MapleStoryClass",
                                        null);
            int checkPeriod = (int)(1.5 * 1000);
            int skillRefresd = 100 * 1000;

            for (; ; )
            {

                RingPst(g, VirtualKeys.N2, RingPstType.press);

                for (int i = 0; i < skillRefresd; i += checkPeriod)
                {
                    if (true == this.locked)
                    {
                        Point p = getCharPoint();
                        int diff = p.X - this.lockP.X;
                        if (diff > 10) // too right
                        {
                            while (getCharPoint().X - this.lockP.X >= 10)
                            {
                                RingPst(g, VirtualKeys.Left, RingPstType.press);
                                System.Threading.Thread.Sleep(10);
                            }
                            RingPst(g, VirtualKeys.Left, RingPstType.up);
                        }
                        else if (diff < -10) // too left
                        {
                            while (getCharPoint().X - this.lockP.X <= -10)
                            {
                                RingPst(g, VirtualKeys.Right, RingPstType.down);
                                System.Threading.Thread.Sleep(10);
                            }
                            RingPst(g, VirtualKeys.Right, RingPstType.up);
                        }
                    }

                    System.Threading.Thread.Sleep(checkPeriod);
                }
            }
        }

        public enum RingPstType
        {
            press,
            down,
            up
        };
        public static void RingPst(IntPtr hwnd, VirtualKeys vk, RingPstType keytype)
        {
            switch (keytype)
            {
                case RingPstType.press:
                    User32.PostMessageA(hwnd, (uint)WMsg.WM_KEYDOWN, (int)vk, makeLp(vk, WMsg.WM_KEYDOWN));
                    User32.PostMessageA(hwnd, (uint)WMsg.WM_KEYUP, (int)vk, makeLp(vk, WMsg.WM_KEYUP));
                    break;
                case RingPstType.down:
                    User32.PostMessageA(hwnd, (uint)WMsg.WM_KEYDOWN, (int)vk, makeLp(vk, WMsg.WM_KEYDOWN));
                    break;
                case RingPstType.up:
                    User32.PostMessageA(hwnd, (uint)WMsg.WM_KEYUP, (int)vk, makeLp(vk, WMsg.WM_KEYUP));
                    break;

            }

        }

        private static int makeLp(VirtualKeys vk, int wmKey)
        {
            uint scanCode = User32.MapVirtualKey((uint)vk, 0);
            uint lParam = 0;
            lParam = (0x00000001 | (scanCode << 16));
            if (wmKey != WMsg.WM_KEYDOWN)
            {
                lParam |= 0xc0000000;
            }
            return (int)lParam;
        }

        public static void sendKey(IntPtr hwnd, VirtualKeys keyCode, bool extended)
        {
            uint scanCode = User32.MapVirtualKey((uint)keyCode, 0);
            uint lParam;

            //KEY DOWN
            lParam = (0x00000001 | (scanCode << 16));
            if (extended)
            {
                lParam = lParam | 0x01000000;
            }

            User32.PostMessage(hwnd, WMsg.WM_KEYDOWN, (IntPtr)keyCode, (IntPtr)lParam);

            //KEY UP

            User32.PostMessage(hwnd, WMsg.WM_KEYUP, (IntPtr)keyCode, (IntPtr)lParam);
        }
        public static void pressKey(IntPtr hwnd, VirtualKeys keyCode, bool extended)
        {
            uint scanCode = User32.MapVirtualKey((uint)keyCode, 0);
            uint lParam;

            //KEY DOWN
            lParam = (0x00000001 | (scanCode << 16));
            if (extended)
            {
                lParam = lParam | 0x01000000;
            }

            User32.PostMessage(hwnd, WMsg.WM_KEYDOWN, (IntPtr)keyCode, (IntPtr)lParam);

            //KEY UP

            // User32.PostMessage(hwnd, WMsg.WM_KEYUP, (IntPtr)keyCode, (IntPtr)lParam);
        }
        public static void releaseKey(IntPtr hwnd, VirtualKeys keyCode, bool extended)
        {
            uint scanCode = User32.MapVirtualKey((uint)keyCode, 0);
            uint lParam;

            //KEY DOWN
            lParam = (0x00000001 | (scanCode << 16));
            if (extended)
            {
                lParam = lParam | 0x01000000;
            }

            // User32.PostMessage(hwnd, WMsg.WM_KEYDOWN, (IntPtr)keyCode, (IntPtr)lParam);

            //KEY UP

            User32.PostMessage(hwnd, WMsg.WM_KEYUP, (IntPtr)keyCode, (IntPtr)lParam);
        }

        private Thread b4t = null;
        private bool bb4t = false;
        private void button4_Click(object sender, EventArgs e)
        {
            if (null == b4t)
            {

                b4t = new Thread(new ThreadStart(Service2));
                b4t.IsBackground = true;
                b4t.Start();
            }
            else
            {
                bb4t = !bb4t;
            }
        }
        private Thread b5t = null;
        private bool bb5t = false;
        private void button5_Click(object sender, EventArgs e)
        {
            if (null == b5t)
            {

                b5t = new Thread(new ThreadStart(Service3));
                b5t.IsBackground = true;
                b5t.Start();
            }
            else
            {
                bb5t = !bb5t;
            }
        }
        private static Point getCharPoint()
        {
            const int xyBaseAddr = 0x00579268;
            const int xOffset = 0x59c;

            var Pointbase = Mem.Pointer(false, 0x04000000 + xyBaseAddr);
            return new Point(Mem.ReadInt(false, Pointbase + xOffset), Mem.ReadInt(false, Pointbase + xOffset + 0x4));
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            const int xybaseaddr = 0x00579268;
            const int xOffset = 0x59c;
            const int yOffset = 0x5a0;

            this.label1.Text = string.Format("{0:d}", Mem.Pointer(true, xybaseaddr, xOffset, 0));
        }
        public int ReadInt32(IntPtr hProcess, IntPtr dwAddress)
        {

            byte[] buffer = new byte[4];
            IntPtr bytesread;

            Kernel32.ReadProcessMemory(hProcess, dwAddress, buffer, 4, out bytesread);
            return BitConverter.ToInt32(buffer, 0);

        }

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            this.locked = checkBox1.Checked;
            if (true == checkBox1.Checked)
            {
                this.lockP = getCharPoint();
            }
        }

        private void button6_Click(object sender, EventArgs e)
        {
            IntPtr g = User32.FindWindow("D3D Window",
              "GrandChase Eternal v1.05.62 (20090120)");
            Collection<IntPtr> cIntPtrs = new Collection<IntPtr>();


            var temp = User32.FindWindowEx(g, IntPtr.Zero, "Edit",string.Empty);
            while (temp != IntPtr.Zero)
            {
                cIntPtrs.Add(temp);
                temp = User32.FindWindowEx(g, temp, "Edit", string.Empty);
            }

            User32.PostMessage(g, WMsg.WM_ACTIVATEAPP, (IntPtr)1, (IntPtr)1748);
           // NativeMethods.SendMessage(hWndButton, WMsg.WM_SETTEXT, 0, "lol");
            int i = 0;
            foreach (var intPtr in cIntPtrs)
            {
                NativeMethods.SendMessage(intPtr, WMsg.WM_SETTEXT, 0, i.ToString());
                if (i <=42)
                {
                    User32.PostMessageA(intPtr, (uint)WMsg.WM_SETFOCUS, (int)VirtualKeys.F9, makeLp(VirtualKeys.F9, WMsg.WM_KEYDOWN));
                    //User32.PostMessageA(intPtr, (uint)WMsg.WM_KEYDOWN, (int)VirtualKeys.Return, makeLp(VirtualKeys.Return, WMsg.WM_KEYDOWN));
                  //  User32.PostMessageA(intPtr, (uint)WMsg.WM_CHAR, (int)VirtualKeys.Return, (int)VirtualKeys.Return);
                //    User32.PostMessageA(intPtr, (uint)WMsg.WM_KEYUP, (int)VirtualKeys.Return, makeLp(VirtualKeys.Return, WMsg.WM_KEYUP));
                    User32.PostMessageA(intPtr, (uint)WMsg.WM_LBUTTONDBLCLK, (int)VirtualKeys.Return, makeLp(VirtualKeys.Return, WMsg.WM_KEYDOWN));
                    User32.PostMessageA(intPtr, (uint)WMsg.WM_LBUTTONDOWN, (int)VirtualKeys.Return, makeLp(VirtualKeys.Return, WMsg.WM_KEYDOWN));
                    User32.PostMessageA(intPtr, (uint)WMsg.WM_LBUTTONUP, (int)VirtualKeys.Return, makeLp(VirtualKeys.Return, WMsg.WM_KEYDOWN));
                }
                User32.PostMessageA(intPtr, (uint)WMsg.WM_SETFOCUS, (int)VirtualKeys.F9, makeLp(VirtualKeys.F9, WMsg.WM_KEYDOWN));
                                    User32.PostMessageA(g, (uint)WMsg.WM_SETFOCUS, (int)VirtualKeys.F9, makeLp(VirtualKeys.F9, WMsg.WM_KEYDOWN));
                    User32.PostMessageA(g, (uint)WMsg.WM_KEYDOWN, (int)VirtualKeys.F9, makeLp(VirtualKeys.F9, WMsg.WM_KEYDOWN));
                    User32.PostMessageA(g, (uint)WMsg.WM_COMMAND, (int)VirtualKeys.F9, makeLp(VirtualKeys.F9, WMsg.WM_KEYDOWN));
                    User32.PostMessageA(g, (uint)WMsg.WM_COMMAND, (int)1,(int)1);
                    User32.PostMessageA(g, (uint)WMsg.WM_CHAR, (int)VirtualKeys.F9, (int)VirtualKeys.F9);
                    User32.PostMessageA(g, (uint)WMsg.WM_KEYUP, (int)VirtualKeys.F9, makeLp(VirtualKeys.F9, WMsg.WM_KEYUP));
                

                i++;
            }
            this.button6.Text = i.ToString();



            return;

            for (; ; )
            {
                foreach (var intPtr in cIntPtrs)
                {
                    User32.PostMessageA(intPtr, (uint)WMsg.WM_SETFOCUS, (int)VirtualKeys.Return, makeLp(VirtualKeys.Return, WMsg.WM_KEYDOWN));
                    System.Threading.Thread.Sleep(33);
                    User32.PostMessageA(intPtr, (uint)WMsg.WM_KEYDOWN, (int)VirtualKeys.Return, makeLp(VirtualKeys.Return, WMsg.WM_KEYDOWN));
                    User32.PostMessageA(intPtr, (uint)WMsg.WM_CHAR, (int)VirtualKeys.Return, (int)VirtualKeys.Return);

                    User32.PostMessageA(intPtr, (uint)WMsg.WM_KEYUP, (int)VirtualKeys.Return, makeLp(VirtualKeys.Return, WMsg.WM_KEYUP));

                    i++;
                }
            }
        }
        

        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        }



    }

    class Kernel32
    {
        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern bool ReadProcessMemory(
          IntPtr hProcess,
          IntPtr lpBaseAddress,
          [Out] byte[] lpBuffer,
          int dwSize,
          out IntPtr lpNumberOfBytesRead
         );

        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern bool ReadProcessMemory(
         IntPtr hProcess,
         IntPtr lpBaseAddress,
         [Out, MarshalAs(UnmanagedType.AsAny)] object lpBuffer,
         int dwSize,
         out IntPtr lpNumberOfBytesRead
        );

        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern bool ReadProcessMemory(
         IntPtr hProcess,
         IntPtr lpBaseAddress,
         IntPtr lpBuffer,
         int dwSize,
         out IntPtr lpNumberOfBytesRead
        );
    }
    class User32
    {
        [DllImport("user32.dll", SetLastError = true)]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        [return: MarshalAs(UnmanagedType.Bool)]
        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool PostMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

        [DllImport("User32.Dll", EntryPoint = "PostMessageA")]
        public static extern bool PostMessageA(IntPtr hWnd, uint msg, int wParam, int lParam);

        [DllImport("user32.dll", SetLastError = true)]
        public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle);
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern uint MapVirtualKey(uint uCode, uint uMapType);
    }

    class WMsg
    {
        public static int WM_ACTIVATE = 0x0006;
        public static int WM_ACTIVATEAPP = 0x001C;
        public static int WM_AFXFIRST = 0x0360;
        public static int WM_AFXLAST = 0x037F;
        public static int WM_APP = 0x8000;
        public static int WM_ASKCBFORMATNAME = 0x030C;
        public static int WM_CANCELJOURNAL = 0x004B;
        public static int WM_CANCELMODE = 0x001F;
        public static int WM_CAPTURECHANGED = 0x0215;
        public static int WM_CHANGECBCHAIN = 0x030D;
        public static int WM_CHANGEUISTATE = 0x0127;
        public static int WM_CHAR = 0x0102;
        public static int WM_CHARTOITEM = 0x002F;
        public static int WM_CHILDACTIVATE = 0x0022;
        public static int WM_CLEAR = 0x0303;
        public static int WM_CLOSE = 0x0010;
        public static int WM_COMMAND = 0x0111;
        public static int WM_COMPACTING = 0x0041;
        public static int WM_COMPAREITEM = 0x0039;
        public static int WM_CONTEXTMENU = 0x007B;
        public static int WM_COPY = 0x0301;
        public static int WM_COPYDATA = 0x004A;
        public static int WM_CREATE = 0x0001;
        public static int WM_CTLCOLORBTN = 0x0135;
        public static int WM_CTLCOLORDLG = 0x0136;
        public static int WM_CTLCOLOREDIT = 0x0133;
        public static int WM_CTLCOLORLISTBOX = 0x0134;
        public static int WM_CTLCOLORMSGBOX = 0x0132;
        public static int WM_CTLCOLORSCROLLBAR = 0x0137;
        public static int WM_CTLCOLORSTATIC = 0x0138;
        public static int WM_CUT = 0x0300;
        public static int WM_DEADCHAR = 0x0103;
        public static int WM_DELETEITEM = 0x002D;
        public static int WM_DESTROY = 0x0002;
        public static int WM_DESTROYCLIPBOARD = 0x0307;
        public static int WM_DEVICECHANGE = 0x0219;
        public static int WM_DEVMODECHANGE = 0x001B;
        public static int WM_DISPLAYCHANGE = 0x007E;
        public static int WM_DRAWCLIPBOARD = 0x0308;
        public static int WM_DRAWITEM = 0x002B;
        public static int WM_DROPFILES = 0x0233;
        public static int WM_ENABLE = 0x000A;
        public static int WM_ENDSESSION = 0x0016;
        public static int WM_ENTERIDLE = 0x0121;
        public static int WM_ENTERMENULOOP = 0x0211;
        public static int WM_ENTERSIZEMOVE = 0x0231;
        public static int WM_ERASEBKGND = 0x0014;
        public static int WM_EXITMENULOOP = 0x0212;
        public static int WM_EXITSIZEMOVE = 0x0232;
        public static int WM_FONTCHANGE = 0x001D;
        public static int WM_GETDLGCODE = 0x0087;
        public static int WM_GETFONT = 0x0031;
        public static int WM_GETHOTKEY = 0x0033;
        public static int WM_GETICON = 0x007F;
        public static int WM_GETMINMAXINFO = 0x0024;
        public static int WM_GETOBJECT = 0x003D;
        public static int WM_GETTEXT = 0x000D;
        public static int WM_GETTEXTLENGTH = 0x000E;
        public static int WM_HANDHELDFIRST = 0x0358;
        public static int WM_HANDHELDLAST = 0x035F;
        public static int WM_HELP = 0x0053;
        public static int WM_HOTKEY = 0x0312;
        public static int WM_HSCROLL = 0x0114;
        public static int WM_HSCROLLCLIPBOARD = 0x030E;
        public static int WM_ICONERASEBKGND = 0x0027;
        public static int WM_IME_CHAR = 0x0286;
        public static int WM_IME_COMPOSITION = 0x010F;
        public static int WM_IME_COMPOSITIONFULL = 0x0284;
        public static int WM_IME_CONTROL = 0x0283;
        public static int WM_IME_ENDCOMPOSITION = 0x010E;
        public static int WM_IME_KEYDOWN = 0x0290;
        public static int WM_IME_KEYLAST = 0x010F;
        public static int WM_IME_KEYUP = 0x0291;
        public static int WM_IME_NOTIFY = 0x0282;
        public static int WM_IME_REQUEST = 0x0288;
        public static int WM_IME_SELECT = 0x0285;
        public static int WM_IME_SETCONTEXT = 0x0281;
        public static int WM_IME_STARTCOMPOSITION = 0x010D;
        public static int WM_INITDIALOG = 0x0110;
        public static int WM_INITMENU = 0x0116;
        public static int WM_INITMENUPOPUP = 0x0117;
        public static int WM_INPUTLANGCHANGE = 0x0051;
        public static int WM_INPUTLANGCHANGEREQUEST = 0x0050;
        public static int WM_KEYDOWN = 0x0100;
        public static int WM_KEYFIRST = 0x0100;
        public static int WM_KEYLAST = 0x0108;
        public static int WM_KEYUP = 0x0101;
        public static int WM_KILLFOCUS = 0x0008;
        public static int WM_LBUTTONDBLCLK = 0x0203;
        public static int WM_LBUTTONDOWN = 0x0201;
        public static int WM_LBUTTONUP = 0x0202;
        public static int WM_MBUTTONDBLCLK = 0x0209;
        public static int WM_MBUTTONDOWN = 0x0207;
        public static int WM_MBUTTONUP = 0x0208;
        public static int WM_MDIACTIVATE = 0x0222;
        public static int WM_MDICASCADE = 0x0227;
        public static int WM_MDICREATE = 0x0220;
        public static int WM_MDIDESTROY = 0x0221;
        public static int WM_MDIGETACTIVE = 0x0229;
        public static int WM_MDIICONARRANGE = 0x0228;
        public static int WM_MDIMAXIMIZE = 0x0225;
        public static int WM_MDINEXT = 0x0224;
        public static int WM_MDIREFRESHMENU = 0x0234;
        public static int WM_MDIRESTORE = 0x0223;
        public static int WM_MDISETMENU = 0x0230;
        public static int WM_MDITILE = 0x0226;
        public static int WM_MEASUREITEM = 0x002C;
        public static int WM_MENUCHAR = 0x0120;
        public static int WM_MENUCOMMAND = 0x0126;
        public static int WM_MENUDRAG = 0x0123;
        public static int WM_MENUGETOBJECT = 0x0124;
        public static int WM_MENURBUTTONUP = 0x0122;
        public static int WM_MENUSELECT = 0x011F;
        public static int WM_MOUSEACTIVATE = 0x0021;
        public static int WM_MOUSEFIRST = 0x0200;
        public static int WM_MOUSEHOVER = 0x02A1;
        public static int WM_MOUSELAST = 0x020D;
        public static int WM_MOUSELEAVE = 0x02A3;
        public static int WM_MOUSEMOVE = 0x0200;
        public static int WM_MOUSEWHEEL = 0x020A;
        public static int WM_MOUSEHWHEEL = 0x020E;
        public static int WM_MOVE = 0x0003;
        public static int WM_MOVING = 0x0216;
        public static int WM_NCACTIVATE = 0x0086;
        public static int WM_NCCALCSIZE = 0x0083;
        public static int WM_NCCREATE = 0x0081;
        public static int WM_NCDESTROY = 0x0082;
        public static int WM_NCHITTEST = 0x0084;
        public static int WM_NCLBUTTONDBLCLK = 0x00A3;
        public static int WM_NCLBUTTONDOWN = 0x00A1;
        public static int WM_NCLBUTTONUP = 0x00A2;
        public static int WM_NCMBUTTONDBLCLK = 0x00A9;
        public static int WM_NCMBUTTONDOWN = 0x00A7;
        public static int WM_NCMBUTTONUP = 0x00A8;
        public static int WM_NCMOUSEHOVER = 0x02A0;
        public static int WM_NCMOUSELEAVE = 0x02A2;
        public static int WM_NCMOUSEMOVE = 0x00A0;
        public static int WM_NCPAINT = 0x0085;
        public static int WM_NCRBUTTONDBLCLK = 0x00A6;
        public static int WM_NCRBUTTONDOWN = 0x00A4;
        public static int WM_NCRBUTTONUP = 0x00A5;
        public static int WM_NCXBUTTONDBLCLK = 0x00AD;
        public static int WM_NCXBUTTONDOWN = 0x00AB;
        public static int WM_NCXBUTTONUP = 0x00AC;
        public static int WM_NCUAHDRAWCAPTION = 0x00AE;
        public static int WM_NCUAHDRAWFRAME = 0x00AF;
        public static int WM_NEXTDLGCTL = 0x0028;
        public static int WM_NEXTMENU = 0x0213;
        public static int WM_NOTIFY = 0x004E;
        public static int WM_NOTIFYFORMAT = 0x0055;
        public static int WM_NULL = 0x0000;
        public static int WM_PAINT = 0x000F;
        public static int WM_PAINTCLIPBOARD = 0x0309;
        public static int WM_PAINTICON = 0x0026;
        public static int WM_PALETTECHANGED = 0x0311;
        public static int WM_PALETTEISCHANGING = 0x0310;
        public static int WM_PARENTNOTIFY = 0x0210;
        public static int WM_PASTE = 0x0302;
        public static int WM_PENWINFIRST = 0x0380;
        public static int WM_PENWINLAST = 0x038F;
        public static int WM_POWER = 0x0048;
        public static int WM_POWERBROADCAST = 0x0218;
        public static int WM_PRINT = 0x0317;
        public static int WM_PRINTCLIENT = 0x0318;
        public static int WM_QUERYDRAGICON = 0x0037;
        public static int WM_QUERYENDSESSION = 0x0011;
        public static int WM_QUERYNEWPALETTE = 0x030F;
        public static int WM_QUERYOPEN = 0x0013;
        public static int WM_QUEUESYNC = 0x0023;
        public static int WM_QUIT = 0x0012;
        public static int WM_RBUTTONDBLCLK = 0x0206;
        public static int WM_RBUTTONDOWN = 0x0204;
        public static int WM_RBUTTONUP = 0x0205;
        public static int WM_RENDERALLFORMATS = 0x0306;
        public static int WM_RENDERFORMAT = 0x0305;
        public static int WM_SETCURSOR = 0x0020;
        public static int WM_SETFOCUS = 0x0007;
        public static int WM_SETFONT = 0x0030;
        public static int WM_SETHOTKEY = 0x0032;
        public static int WM_SETICON = 0x0080;
        public static int WM_SETREDRAW = 0x000B;
        public static int WM_SETTEXT = 0x000C;
        public static int WM_SETTINGCHANGE = 0x001A;
        public static int WM_SHOWWINDOW = 0x0018;
        public static int WM_SIZE = 0x0005;
        public static int WM_SIZECLIPBOARD = 0x030B;
        public static int WM_SIZING = 0x0214;
        public static int WM_SPOOLERSTATUS = 0x002A;
        public static int WM_STYLECHANGED = 0x007D;
        public static int WM_STYLECHANGING = 0x007C;
        public static int WM_SYNCPAINT = 0x0088;
        public static int WM_SYSCHAR = 0x0106;
        public static int WM_SYSCOLORCHANGE = 0x0015;
        public static int WM_SYSCOMMAND = 0x0112;
        public static int WM_SYSDEADCHAR = 0x0107;
        public static int WM_SYSKEYDOWN = 0x0104;
        public static int WM_SYSKEYUP = 0x0105;
        public static int WM_TCARD = 0x0052;
        public static int WM_TIMECHANGE = 0x001E;
        public static int WM_TIMER = 0x0113;
        public static int WM_UNDO = 0x0304;
        public static int WM_UNINITMENUPOPUP = 0x0125;
        public static int WM_USER = 0x0400;
        public static int WM_USERCHANGED = 0x0054;
        public static int WM_VKEYTOITEM = 0x002E;
        public static int WM_VSCROLL = 0x0115;
        public static int WM_VSCROLLCLIPBOARD = 0x030A;
        public static int WM_WINDOWPOSCHANGED = 0x0047;
        public static int WM_WINDOWPOSCHANGING = 0x0046;
        public static int WM_WININICHANGE = 0x001A;
        public static int WM_XBUTTONDBLCLK = 0x020D;
        public static int WM_XBUTTONDOWN = 0x020B;
        public static int WM_XBUTTONUP = 0x020C;
    }
    /// <summary>
    /// Enumeration for virtual keys.
    /// </summary>
    public enum VirtualKeys
        : ushort
    {
        /// <summary></summary>
        LeftButton = 0x01,
        /// <summary></summary>
        RightButton = 0x02,
        /// <summary></summary>
        Cancel = 0x03,
        /// <summary></summary>
        MiddleButton = 0x04,
        /// <summary></summary>
        ExtraButton1 = 0x05,
        /// <summary></summary>
        ExtraButton2 = 0x06,
        /// <summary></summary>
        Back = 0x08,
        /// <summary></summary>
        Tab = 0x09,
        /// <summary></summary>
        Clear = 0x0C,
        /// <summary></summary>
        Return = 0x0D,
        /// <summary></summary>
        Shift = 0x10,
        /// <summary></summary>
        Control = 0x11,
        /// <summary></summary>
        Menu = 0x12,
        /// <summary></summary>
        Pause = 0x13,
        /// <summary></summary>
        CapsLock = 0x14,
        /// <summary></summary>
        Kana = 0x15,
        /// <summary></summary>
        Hangeul = 0x15,
        /// <summary></summary>
        Hangul = 0x15,
        /// <summary></summary>
        Junja = 0x17,
        /// <summary></summary>
        Final = 0x18,
        /// <summary></summary>
        Hanja = 0x19,
        /// <summary></summary>
        Kanji = 0x19,
        /// <summary></summary>
        Escape = 0x1B,
        /// <summary></summary>
        Convert = 0x1C,
        /// <summary></summary>
        NonConvert = 0x1D,
        /// <summary></summary>
        Accept = 0x1E,
        /// <summary></summary>
        ModeChange = 0x1F,
        /// <summary></summary>
        Space = 0x20,
        /// <summary></summary>
        Prior = 0x21,
        /// <summary></summary>
        Next = 0x22,
        /// <summary></summary>
        End = 0x23,
        /// <summary></summary>
        Home = 0x24,
        /// <summary></summary>
        Left = 0x25,
        /// <summary></summary>
        Up = 0x26,
        /// <summary></summary>
        Right = 0x27,
        /// <summary></summary>
        Down = 0x28,
        /// <summary></summary>
        Select = 0x29,
        /// <summary></summary>
        Print = 0x2A,
        /// <summary></summary>
        Execute = 0x2B,
        /// <summary></summary>
        Snapshot = 0x2C,
        /// <summary></summary>
        Insert = 0x2D,
        /// <summary></summary>
        Delete = 0x2E,
        /// <summary></summary>
        Help = 0x2F,
        /// <summary></summary>
        N0 = 0x30,
        /// <summary></summary>
        N1 = 0x31,
        /// <summary></summary>
        N2 = 0x32,
        /// <summary></summary>
        N3 = 0x33,
        /// <summary></summary>
        N4 = 0x34,
        /// <summary></summary>
        N5 = 0x35,
        /// <summary></summary>
        N6 = 0x36,
        /// <summary></summary>
        N7 = 0x37,
        /// <summary></summary>
        N8 = 0x38,
        /// <summary></summary>
        N9 = 0x39,
        /// <summary></summary>
        A = 0x41,
        /// <summary></summary>
        B = 0x42,
        /// <summary></summary>
        C = 0x43,
        /// <summary></summary>
        D = 0x44,
        /// <summary></summary>
        E = 0x45,
        /// <summary></summary>
        F = 0x46,
        /// <summary></summary>
        G = 0x47,
        /// <summary></summary>
        H = 0x48,
        /// <summary></summary>
        I = 0x49,
        /// <summary></summary>
        J = 0x4A,
        /// <summary></summary>
        K = 0x4B,
        /// <summary></summary>
        L = 0x4C,
        /// <summary></summary>
        M = 0x4D,
        /// <summary></summary>
        N = 0x4E,
        /// <summary></summary>
        O = 0x4F,
        /// <summary></summary>
        P = 0x50,
        /// <summary></summary>
        Q = 0x51,
        /// <summary></summary>
        R = 0x52,
        /// <summary></summary>
        S = 0x53,
        /// <summary></summary>
        T = 0x54,
        /// <summary></summary>
        U = 0x55,
        /// <summary></summary>
        V = 0x56,
        /// <summary></summary>
        W = 0x57,
        /// <summary></summary>
        X = 0x58,
        /// <summary></summary>
        Y = 0x59,
        /// <summary></summary>
        Z = 0x5A,
        /// <summary></summary>
        LeftWindows = 0x5B,
        /// <summary></summary>
        RightWindows = 0x5C,
        /// <summary></summary>
        Application = 0x5D,
        /// <summary></summary>
        Sleep = 0x5F,
        /// <summary></summary>
        Numpad0 = 0x60,
        /// <summary></summary>
        Numpad1 = 0x61,
        /// <summary></summary>
        Numpad2 = 0x62,
        /// <summary></summary>
        Numpad3 = 0x63,
        /// <summary></summary>
        Numpad4 = 0x64,
        /// <summary></summary>
        Numpad5 = 0x65,
        /// <summary></summary>
        Numpad6 = 0x66,
        /// <summary></summary>
        Numpad7 = 0x67,
        /// <summary></summary>
        Numpad8 = 0x68,
        /// <summary></summary>
        Numpad9 = 0x69,
        /// <summary></summary>
        Multiply = 0x6A,
        /// <summary></summary>
        Add = 0x6B,
        /// <summary></summary>
        Separator = 0x6C,
        /// <summary></summary>
        Subtract = 0x6D,
        /// <summary></summary>
        Decimal = 0x6E,
        /// <summary></summary>
        Divide = 0x6F,
        /// <summary></summary>
        F1 = 0x70,
        /// <summary></summary>
        F2 = 0x71,
        /// <summary></summary>
        F3 = 0x72,
        /// <summary></summary>
        F4 = 0x73,
        /// <summary></summary>
        F5 = 0x74,
        /// <summary></summary>
        F6 = 0x75,
        /// <summary></summary>
        F7 = 0x76,
        /// <summary></summary>
        F8 = 0x77,
        /// <summary></summary>
        F9 = 0x78,
        /// <summary></summary>
        F10 = 0x79,
        /// <summary></summary>
        F11 = 0x7A,
        /// <summary></summary>
        F12 = 0x7B,
        /// <summary></summary>
        F13 = 0x7C,
        /// <summary></summary>
        F14 = 0x7D,
        /// <summary></summary>
        F15 = 0x7E,
        /// <summary></summary>
        F16 = 0x7F,
        /// <summary></summary>
        F17 = 0x80,
        /// <summary></summary>
        F18 = 0x81,
        /// <summary></summary>
        F19 = 0x82,
        /// <summary></summary>
        F20 = 0x83,
        /// <summary></summary>
        F21 = 0x84,
        /// <summary></summary>
        F22 = 0x85,
        /// <summary></summary>
        F23 = 0x86,
        /// <summary></summary>
        F24 = 0x87,
        /// <summary></summary>
        NumLock = 0x90,
        /// <summary></summary>
        ScrollLock = 0x91,
        /// <summary></summary>
        NEC_Equal = 0x92,
        /// <summary></summary>
        Fujitsu_Jisho = 0x92,
        /// <summary></summary>
        Fujitsu_Masshou = 0x93,
        /// <summary></summary>
        Fujitsu_Touroku = 0x94,
        /// <summary></summary>
        Fujitsu_Loya = 0x95,
        /// <summary></summary>
        Fujitsu_Roya = 0x96,
        /// <summary></summary>
        LeftShift = 0xA0,
        /// <summary></summary>
        RightShift = 0xA1,
        /// <summary></summary>
        LeftControl = 0xA2,
        /// <summary></summary>
        RightControl = 0xA3,
        /// <summary></summary>
        LeftMenu = 0xA4,
        /// <summary></summary>
        RightMenu = 0xA5,
        /// <summary></summary>
        BrowserBack = 0xA6,
        /// <summary></summary>
        BrowserForward = 0xA7,
        /// <summary></summary>
        BrowserRefresh = 0xA8,
        /// <summary></summary>
        BrowserStop = 0xA9,
        /// <summary></summary>
        BrowserSearch = 0xAA,
        /// <summary></summary>
        BrowserFavorites = 0xAB,
        /// <summary></summary>
        BrowserHome = 0xAC,
        /// <summary></summary>
        VolumeMute = 0xAD,
        /// <summary></summary>
        VolumeDown = 0xAE,
        /// <summary></summary>
        VolumeUp = 0xAF,
        /// <summary></summary>
        MediaNextTrack = 0xB0,
        /// <summary></summary>
        MediaPrevTrack = 0xB1,
        /// <summary></summary>
        MediaStop = 0xB2,
        /// <summary></summary>
        MediaPlayPause = 0xB3,
        /// <summary></summary>
        LaunchMail = 0xB4,
        /// <summary></summary>
        LaunchMediaSelect = 0xB5,
        /// <summary></summary>
        LaunchApplication1 = 0xB6,
        /// <summary></summary>
        LaunchApplication2 = 0xB7,
        /// <summary></summary>
        OEM1 = 0xBA,
        /// <summary></summary>
        OEMPlus = 0xBB,
        /// <summary></summary>
        OEMComma = 0xBC,
        /// <summary></summary>
        OEMMinus = 0xBD,
        /// <summary></summary>
        OEMPeriod = 0xBE,
        /// <summary></summary>
        OEM2 = 0xBF,
        /// <summary></summary>
        OEM3 = 0xC0,
        /// <summary></summary>
        OEM4 = 0xDB,
        /// <summary></summary>
        OEM5 = 0xDC,
        /// <summary></summary>
        OEM6 = 0xDD,
        /// <summary></summary>
        OEM7 = 0xDE,
        /// <summary></summary>
        OEM8 = 0xDF,
        /// <summary></summary>
        OEMAX = 0xE1,
        /// <summary></summary>
        OEM102 = 0xE2,
        /// <summary></summary>
        ICOHelp = 0xE3,
        /// <summary></summary>
        ICO00 = 0xE4,
        /// <summary></summary>
        ProcessKey = 0xE5,
        /// <summary></summary>
        ICOClear = 0xE6,
        /// <summary></summary>
        Packet = 0xE7,
        /// <summary></summary>
        OEMReset = 0xE9,
        /// <summary></summary>
        OEMJump = 0xEA,
        /// <summary></summary>
        OEMPA1 = 0xEB,
        /// <summary></summary>
        OEMPA2 = 0xEC,
        /// <summary></summary>
        OEMPA3 = 0xED,
        /// <summary></summary>
        OEMWSCtrl = 0xEE,
        /// <summary></summary>
        OEMCUSel = 0xEF,
        /// <summary></summary>
        OEMATTN = 0xF0,
        /// <summary></summary>
        OEMFinish = 0xF1,
        /// <summary></summary>
        OEMCopy = 0xF2,
        /// <summary></summary>
        OEMAuto = 0xF3,
        /// <summary></summary>
        OEMENLW = 0xF4,
        /// <summary></summary>
        OEMBackTab = 0xF5,
        /// <summary></summary>
        ATTN = 0xF6,
        /// <summary></summary>
        CRSel = 0xF7,
        /// <summary></summary>
        EXSel = 0xF8,
        /// <summary></summary>
        EREOF = 0xF9,
        /// <summary></summary>
        Play = 0xFA,
        /// <summary></summary>
        Zoom = 0xFB,
        /// <summary></summary>
        Noname = 0xFC,
        /// <summary></summary>
        PA1 = 0xFD,
        /// <summary></summary>
        OEMClear = 0xFE
    }
}
